//
let id = 0;
class Dep {
  constructor() {
    this.id = id++;
    this.subs = []; // 存放依赖的 watcher
  }
  depend() {
    // 让 watcher 记住 dep
    Dep.target.addDep(this);
  }
  addSub(watcher) {
    this.subs.push(watcher);
  }

  notify() {
    this.subs.forEach((watcher) => watcher.update());
  }
}
Dep.target = null; // 静态属性，全局共用，实际就是一个指针
let stack = [];
// 因为既要收集计算属性 watcher ,同时也要收集渲染 watcher, 因此仅仅 Dep.target 一个变量来存储是不够的的，因它只能收集一个
// 所以可以用栈形结构来收集， 多个 watcher 共存；渲染过程中遇到计算属性时，外层是渲染 watcher ,内层是计算 watcher
export function pushTarget(watcher) {
  Dep.target = watcher;
  stack.push(watcher);
  log("stack=====", stack);
}
export function popTarget() {
  stack.pop(); // 取值完成后将此 watcher 从栈中弹出, 等待下次取值之前再压进栈中；
  Dep.target = stack[stack.length - 1];
}

export default Dep;
